package nan.object_oriented;

interface Shape3{
    void draw();//接口中可以不加 public abstract
    int COUNT=0;
    //jdk1.8的新特性
    default void func(){
        System.out.println("func!!");
    }
}
interface Shape4{
    void func2();
}
//extends：扩展，此时Shape5同时拥有了Shape4,Shape3两个接口的功能
interface Shape5 extends Shape4,Shape3{
    void draw();
}
class Cycle3 implements Shape5{//Cycle3就是一个接口
    @Override
    public void draw() {//重写了draw方法
        System.out.println("yuanquan");
    }

    @Override
    public void func2() {//Shape5里面拥有3,4 接口，所以3和4种的抽象方法都要被重写
    }
}


//abstract class Shape2{
//    //抽象方法：被abstract所修饰的方法。抽象的方法是没有具体的实现的
//    public abstract void draw();
//    void func() {
//        System.out.println("func");
//    }
//    }
//class Cycle2 extends Shape2 {
//    //如果一个普通类继承了一个抽象类，那么这个普通类一定
//    // 要重写抽象类当中的抽象方法
//    @Override
//    public void draw() {
//        System.out.println("画一个圆圈");
//    }
//}
//
public class Main3 {
//    //多态此时 shape 这个引用调用 draw 方法可能会有多种不同的表现
//   //(和 shape 对应的实例相关)
    public static void drawMap(Shape3 shape) {
        shape.draw();
    }
//    public static void main(String[] args) {
//        //Shape2 shape2 = new Shape2();//抽象类不能直接实例化
//      Cycle2 cycle2=new Cycle2();
//      drawMap(cycle2);//实例化cycle2，调用drawMap
//        cycle2.func();
//    }
public static void main(String[] args) {
    //Shape3 shape=new Shape3() ;//接口也不能实例化
    Shape3 shape3=new Cycle3();//shape3引用的对象一定是实现当前这个接口的
    drawMap(shape3);
}
}
